import urlConfig from "@/request/urlConfig.js"; // 引入接口地址配置
// import store from "@/store";

// 封装请求类
class Request {
	constructor() {
		// 接口根地址
		this.baseURL = urlConfig.baseURL;
		// 常用请求头
		this.headerInfo = {
			0: "application/json;charset=UTF-8",
			1: "application/x-www-form-urlencoded;charset=UTF-8",
			2: "multipart/form-data",
			3: "application/json",
			4: "application/x-www-form-urlencoded",
		};
		// 默认配置
		this.defaultConfig = {
			headerIndex: 0, // 默认请求头索引
			url: "", // 请求地址
			method: "POST", // 默认请求方法
			// 默认data的参数
			data: {},
			mask: true, // 请求提示弹框是否开启遮罩
			specialHandling: false, // 这个接口是否需要特别处理
			timeout: 3000000, // 默认接口超时时间
		};
		// 定时器
		this.requestTimer = null;
	}

	// 动态处理接口url里面的/
	setRequestUrl(url) {
		let {
			baseURL
		} = this;
		// 如果是完整地址了，直接返回url
		if (/^http(s)?:\/\//.test(url)) {
			return url;
		}
		// 如果baseURL是以/结尾的，就将结尾的/替换成空字符串
		if (/\/$/.test(baseURL)) {
			baseURL = baseURL.replace(/\/$/, "");
		}
		// 如果url不是以/开头的就将url前面拼接一个/
		if (!/^\//.test(url)) {
			url = "/" + url;
		}
		return baseURL + url;
	}

	// 请求弹框
	requestToast(title, mask) {
		const {
			requestTimer
		} = this;
		// 调用之前清除定时器
		requestTimer && clearTimeout(requestTimer);
		this.requestTimer = null;
		// 因为showToast和showLoading底层是一个东西，所以做下延时
		this.requestTimer = setTimeout(() => {
			uni.showToast({
				title: title || "",
				icon: "none",
				duration: 1500,
				mask: mask !== false,
			});
		}, 10);
	}

	// 请求函数
	request(config = {}) {
		const {
			headerInfo,
			defaultConfig
		} = this;
		// 将传递的参数和默认参数合并
		const currentConfig = Object.assign({}, defaultConfig, config);
		return new Promise((resolve, reject) => {
			uni.request({
				url: this.setRequestUrl(currentConfig.url),
				// 这里防止有时候传小写的get post delete put等，都转换成大写
				method: currentConfig.method.toUpperCase(),
				timeout: currentConfig.timeout,
				header: {
					"Content-Type": headerInfo[currentConfig.headerIndex],
					// Authorization: uni.getStorageSync('token') || "",
					'User-Token': uni.getStorageSync('token') || ""
				},
				data: currentConfig.data || defaultConfig.data,
				success: (res) => {
					console.log(res,"报错时");
					const resData = res.data || {};
					if (res.statusCode !== 200) {
						// #ifdef APP-PLUS
						console.log("请求失败接口地址", currentConfig.url);
						console.log("请求失败接口参数", JSON.stringify(currentConfig.data ||
							defaultConfig.data));
						// #endif
						this.requestToast(
							resData.msg || "请求失败，网络或服务器异常",
							currentConfig.mask
						);
						console.log("请求失败，网络或服务器异常", resData);
						return reject(resData);
					}
					// 处理后端接口的code
					switch (resData.code) {
						case 200:
						case "200":
						case undefined:
							// #ifdef APP-PLUS
							console.log("正常接口地址", currentConfig.url);
							console.log("正常接口参数", JSON.stringify(currentConfig.data ||
								defaultConfig.data));
							// #endif
						  console.log(resData,'正常')
						  if(resData.success_flag == 200){
							 resolve(resData);
						  }else{
							  uni.hideLoading()
							  this.requestToast(
							  	resData.error_msg || "操作失败",
							  	currentConfig.mask
							  );
							  reject(resData);
						  }
							uni.hideLoading()
							break;
						case 501:
						case "501":
							// #ifdef APP-PLUS
							console.log("无权限接口地址", currentConfig.url);
							console.log("无权限接口参数", JSON.stringify(currentConfig.data ||
								defaultConfig.data));
							// #endif
							console.log("无权限接口信息", resData);
							// 如果不需要特殊处理，就抛出异常提示
							if (!currentConfig.specialHandling) {
								this.requestToast(
									resData.msg || "您尚未登录，请登录后在进行操作",
									currentConfig.mask
								);
							}

							uni.$u.debounce(
								() => {
									uni.reLaunch({
										url: "/pages/login/login",
									});
								},
								1000,
								true
							);
							reject(resData);
							break;
						default:
							// #ifdef APP-PLUS
							console.log("异常接口地址", currentConfig.url);
							console.log("异常接口参数", JSON.stringify(currentConfig.data ||
								defaultConfig.data));
							// #endif
							console.log("异常接口信息", resData);
							// 如果不需要特殊处理，就抛出异常提示
							if (!currentConfig.specialHandling) {
								this.requestToast(
									resData.msg || "服务器未知异常",
									currentConfig.mask
								);
							}
							reject(resData);
							break;
					}
				},
				fail: (err) => {
					// 如果不需要特殊处理，就抛出异常提示
					if (!currentConfig.specialHandling) {
						// 如果包含timeout提示请求超时
						if (err.errMsg.includes("timeout")) {
							this.requestToast(
								"请求超时，网络或服务器异常",
								currentConfig.mask
							);
							console.log("请求超时，网络或服务器异常", err);
						} else {
							// 提示请求异常
							this.requestToast(
								"请求失败，网络或服务器异常",
								currentConfig.mask
							);
							console.log("请求失败，网络或服务器异常", err);
						}
					}
					reject(err);
				},
			});
		});
	}

	// get请求
	get(config = {}) {
		return this.request({
			method: "GET",
			...config,
		});
	}

	// post请求
	post(config = {}) {
		return this.request({
			method: "POST",
			...config,
		});
	}

	// put请求
	put(config = {}) {
		return this.request({
			method: "PUT",
			...config,
		});
	}

	// delete请求
	delete(config = {}) {
		return this.request({
			method: "DELETE",
			...config,
		});
	}
}

export default new Request();